package com.example.base_model.utils

import android.widget.ImageView
import androidx.annotation.DrawableRes
import coil3.load
import coil3.request.fallback
import coil3.request.placeholder
import coil3.request.transformations
import coil3.transform.CircleCropTransformation
import coil3.transform.RoundedCornersTransformation

/**
 * @Author jiangKunKun
 * @CreateDate 2025/8/25
 * @Description 图片加载工具类 - 基于 Coil
 *              提供统一的图片加载接口，支持加载普通图片、圆形图片和圆角图片，
 *              并可配置占位图、错误图和加载前显示的图片。
 * @SpittingGrooves
 */
object ImageLoader {
    /**
     * 加载普通图片。
     * 使用 Coil 库加载图片到指定的 ImageView，可配置占位符、错误图和加载前显示的图片。
     *
     * @param imageView ImageView控件，图片将加载到此视图中。
     * @param url 图片地址，可以是 URL 字符串、Uri、文件路径、DrawableRes 等 Coil 支持的任何类型。
     * @param placeholderRes 加载中显示的占位图资源ID (可选)。
     * @param errorRes 加载失败时显示的图片资源ID (可选)。
     * @param fallbackRes 开始加载前（例如 url 为 null 或空时）显示的图片资源ID (可选)。
     */
    fun loadImage(
        imageView: ImageView,
        url: Any?,
        @DrawableRes placeholderRes: Int? = null,
        @DrawableRes errorRes: Int? = null,
        @DrawableRes fallbackRes: Int? = null
    ) {
        imageView.load(url) { // 使用 Coil 的扩展函数 load 加载图片
            // 配置加载中占位图
            placeholderRes?.let { placeholder(it) }
            // 配置加载失败显示的图片
            errorRes?.let { error(it) }
            // 配置开始加载前显示的图片
            fallbackRes?.let { fallback(it) }
        }
    }

    /**
     * 加载圆形图片。
     * 使用 Coil 库加载图片并将其裁剪为圆形，可配置占位符、错误图和加载前显示的图片。
     *
     * @param imageView ImageView控件，图片将加载到此视图中。
     * @param url 图片地址，可以是 URL 字符串、Uri、文件路径、DrawableRes 等 Coil 支持的任何类型。
     * @param placeholderRes 加载中显示的占位图资源ID (可选)。
     * @param errorRes 加载失败时显示的图片资源ID (可选)。
     * @param fallbackRes 开始加载前（例如 url 为 null 或空时）显示的图片资源ID (可选)。
     */
    fun loadCircleImage(
        imageView: ImageView,
        url: Any?,
        @DrawableRes placeholderRes: Int? = null,
        @DrawableRes errorRes: Int? = null,
        @DrawableRes fallbackRes: Int? = null
    ) {
        imageView.load(url) {
            placeholderRes?.let { placeholder(it) }
            errorRes?.let { error(it) }
            fallbackRes?.let { fallback(it) }
            // 应用圆形裁剪转换
            transformations(CircleCropTransformation())
        }
    }

    /**
     * 加载圆角图片 - 四个角具有相同的圆角半径。
     * 使用 Coil 库加载图片并应用圆角转换，可配置占位符、错误图和加载前显示的图片。
     *
     * @param imageView ImageView控件，图片将加载到此视图中。
     * @param url 图片地址，可以是 URL 字符串、Uri、文件路径、DrawableRes 等 Coil 支持的任何类型。
     * @param radius 圆角半径 (dp)。四个角将应用相同的半径。
     * @param placeholderRes 加载中显示的占位图资源ID (可选)。
     * @param errorRes 加载失败时显示的图片资源ID (可选)。
     * @param fallbackRes 开始加载前（例如 url 为 null 或空时）显示的图片资源ID (可选)。
     */
    fun loadRoundedImage(
        imageView: ImageView,
        url: Any?,
        radius: Float,
        @DrawableRes placeholderRes: Int? = null,
        @DrawableRes errorRes: Int? = null,
        @DrawableRes fallbackRes: Int? = null
    ) {
        imageView.load(url) {
            placeholderRes?.let { placeholder(it) }
            errorRes?.let { error(it) }
            fallbackRes?.let { fallback(it) }
            // 应用统一圆角转换
            transformations(RoundedCornersTransformation(radius))
        }
    }

    /**
     * 加载圆角图片 - 可分别设置四个角的圆角半径。
     * 使用 Coil 库加载图片并为每个角应用不同的圆角转换，可配置占位符、错误图和加载前显示的图片。
     *
     * @param imageView ImageView控件，图片将加载到此视图中。
     * @param url 图片地址，可以是 URL 字符串、Uri、文件路径、DrawableRes 等 Coil 支持的任何类型。
     * @param topLeft 左上角圆角半径 (dp)，默认为0f。
     * @param topRight 右上角圆角半径 (dp)，默认为0f。
     * @param bottomLeft 左下角圆角半径 (dp)，默认为0f。
     * @param bottomRight 右下角圆角半径 (dp)，默认为0f。
     * @param placeholderRes 加载中显示的占位图资源ID (可选)。
     * @param errorRes 加载失败时显示的图片资源ID (可选)。
     * @param fallbackRes 开始加载前（例如 url 为 null 或空时）显示的图片资源ID (可选)。
     */
    fun loadRoundedImage(
        imageView: ImageView,
        url: Any?,
        topLeft: Float = 0f,
        topRight: Float = 0f,
        bottomLeft: Float = 0f,
        bottomRight: Float = 0f,
        @DrawableRes placeholderRes: Int? = null,
        @DrawableRes errorRes: Int? = null,
        @DrawableRes fallbackRes: Int? = null
    ) {
        imageView.load(url) {
            placeholderRes?.let { placeholder(it) }
            errorRes?.let { error(it) }
            fallbackRes?.let { fallback(it) }
            // 应用可单独设置四个角的圆角转换
            transformations(
                RoundedCornersTransformation(
                    topLeft = topLeft,
                    topRight = topRight,
                    bottomLeft = bottomLeft,
                    bottomRight = bottomRight
                )
            )
        }
    }
}